package study.jdk.spi.echo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Iterator;
import java.util.ServiceLoader;

/**
 * （1）JDBC加载不同类型的驱动
 * （2）SLF4J对log4j/logback的支持
 * （3）Spring中大量使用了SPI,比如：对servlet3.0规范对ServletContainerInitializer的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等
 * （4）Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对java提供的原生SPI做了封装
 * （5）更多应用场景需要大家一起去发现，或者自己使用SPI机制实现代码的解耦
 */
public interface Echo {

    //无法使用 @Slf4j 的结果
    Logger log = LoggerFactory.getLogger(Echo.class);

    String echo(String name);

    static Echo load() {
        //ServiceLoader 实现了 Iterable，可以加载到接口的多个实现类
        ServiceLoader<Echo> loader = ServiceLoader.load(Echo.class);
        Iterator<Echo> it = loader.iterator();
        while (it.hasNext()) {
            Echo echo = it.next();
            log.info(">>> {}", echo.getClass().getSimpleName());
        }
        return loader.iterator().next();
    }
}
